package Utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 张
 * Date: 2025-01-22
 * Time: 13:43
 */
//创建子进程
public class CommandUtil {

    // 1. 通过Runtime类得到 Runtime 实例,执行exec方法
    // 2. 获取标准输出,并写入到指定文件中
    // 3, 获取标准错误,并写入到指定文件中
    // 4. 等待子进程结束,获取到进程的状态码,并返回
    public static int run(String cmd,String stdoutFile,String stderrFile) {
        try{
            // 1. 通过Runtime类得到 Runtime 实例,执行exec方法
            Process process = Runtime.getRuntime().exec(cmd);
            // 2. 获取标准输出,并写入到指定文件中
            if(stdoutFile != null) {
                InputStream stdoutFrom = process.getInputStream();
                FileOutputStream stdoutTo = new FileOutputStream(stdoutFile);
                while (true) {
                    int ch = stdoutFrom.read();
                    if(ch == -1) {
                        break;
                    }
                    stdoutTo.write(ch);
                }
                stdoutTo.close();
                stdoutFrom.close();
            }
            // 3, 获取标准错误,并写入到指定文件中
            if(stderrFile != null) {
                InputStream stderrFrom = process.getErrorStream();
                OutputStream stderrTo = new FileOutputStream(stderrFile);
                while (true) {
                    int ch = stderrFrom.read();
                    if(ch == -1) {
                        break;
                    }
                    stderrTo.write(ch);
                }
                stderrTo.close();
                stderrFrom.close();
            }
            // 4. 等待子进程结束,获取到进程的状态码,并返回
            int exitCode = process.waitFor();
            return exitCode;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return 1;//程序出错
    }

    public static void main(String[] args) {
        CommandUtil.run("javac","stdout.txt","stderr.txt");
    }
}
